--实现可重入的redis锁上锁过程
--原理：使用hash结构 key(lock):value(field[thread1],value[1])

local key = KEYS[1]; --锁的key
local threadId = ARGV[1]; --线程唯一标识
local releaseTime = ARGV[2]; -- 锁的自动释放时间
--判断锁是否存在
if (redis.call('exists', key) == 0) then
    --不存在，获取锁(也就是设置key)
    redis.call('hset', key, threadId, '1');
    --设置有效时间
    redis.call('expire', key, releaseTime);
    -- 返回结果
    return 1;
end;
-- 锁已经存在，判断threadId是否是自己
if (redis.call('hexists', key, threadId) == 1) then
    --获取锁，重入次数加1
    redis.call('hincrby', key, threadId, '1');
    -- 设置有效期
    redis.call('expire', key, releaseTime);
    return 1;
end;
--走到这说明获取的锁不是自己的，获取锁失败
return 0;